home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / os2 / adaptor.zip / ADAPT.ZIP / adaptor / src / normallo.c < prev    next >
Text File  |  1994-01-03  |  14KB  |  600 lines

  1. # include "NormalLo.h"
  2. # include "yyNLoop.w"
  3. # include <stdio.h>
  4. # if defined __STDC__ | defined __cplusplus
  5. #  include <stdlib.h>
  6. # else
  7.    extern void exit ();
  8. # endif
  9. # include "Tree.h"
  10. # include "Definiti.h"
  11.  
  12. # ifndef NULL
  13. # define NULL 0L
  14. # endif
  15. # ifndef false
  16. # define false 0
  17. # endif
  18. # ifndef true
  19. # define true 1
  20. # endif
  21.  
  22. # ifdef yyInline
  23. # define yyALLOC(tree, free, max, alloc, nodesize, make, ptr, kind) \
  24.   if ((ptr = (tree) free) >= (tree) max) ptr = alloc (); \
  25.   free += nodesize [kind]; \
  26.   ptr->yyHead.yyMark = 0; \
  27.   ptr->Kind = kind;
  28. # else
  29. # define yyALLOC(tree, free, max, alloc, nodesize, make, ptr, kind) ptr = make (kind);
  30. # endif
  31.  
  32. # define yyWrite(s) (void) fputs (s, yyf)
  33. # define yyWriteNl (void) fputc ('\n', yyf)
  34.  
  35. # line 17 "NormalLoop.puma"
  36.  
  37.  
  38. # include "Idents.h"
  39. # include "StringMe.h"
  40.  
  41. # include "protocol.h"
  42.  
  43. # include "Expressi.h"   /* AddConstant */
  44.  
  45.  
  46.  
  47. static FILE * yyf = stdout;
  48.  
  49. static void yyAbort
  50. # ifdef __cplusplus
  51.  (char * yyFunction)
  52. # else
  53.  (yyFunction) char * yyFunction;
  54. # endif
  55. {
  56.  (void) fprintf (stderr, "Error: module NormalLoop, routine %s failed\n", yyFunction);
  57.  exit (1);
  58. }
  59.  
  60. void NormalLoop ARGS((tTree loop, int inc));
  61. static void DoReplace ARGS((tTree t, tTree id, int inc));
  62. static tTree ReplaceExp ARGS((tTree exp, tTree id, int inc));
  63.  
  64. void NormalLoop
  65. # if defined __STDC__ | defined __cplusplus
  66. (register tTree loop, register int inc)
  67. # else
  68. (loop, inc)
  69.  register tTree loop;
  70.  register int inc;
  71. # endif
  72. {
  73.   if (loop == NoTree) return;
  74.   if (loop->Kind == kACF_FORALL) {
  75. # line 40 "NormalLoop.puma"
  76.   {
  77. # line 41 "NormalLoop.puma"
  78.  loop->ACF_FORALL.FORALL_RANGE->SLICE_EXP.START = AddConstant (loop->ACF_FORALL.FORALL_RANGE->SLICE_EXP.START, inc);
  79.       loop->ACF_FORALL.FORALL_RANGE->SLICE_EXP.STOP = AddConstant (loop->ACF_FORALL.FORALL_RANGE->SLICE_EXP.STOP, inc);
  80.       DoReplace (loop->ACF_FORALL.FORALL_BODY, loop->ACF_FORALL.FORALL_ID, -inc);
  81.  
  82.   }
  83.    return;
  84.  
  85.   }
  86.   if (loop->Kind == kACF_DO) {
  87. # line 47 "NormalLoop.puma"
  88.   {
  89. # line 48 "NormalLoop.puma"
  90.  loop->ACF_DO.DO_RANGE->SLICE_EXP.START = AddConstant (loop->ACF_DO.DO_RANGE->SLICE_EXP.START, inc);
  91.       loop->ACF_DO.DO_RANGE->SLICE_EXP.STOP = AddConstant (loop->ACF_DO.DO_RANGE->SLICE_EXP.STOP, inc);
  92.       DoReplace (loop->ACF_DO.DO_BODY, loop->ACF_DO.DO_ID, -inc);
  93.  
  94.   }
  95.    return;
  96.  
  97.   }
  98.   if (loop->Kind == kACF_DOLOCAL) {
  99. # line 54 "NormalLoop.puma"
  100.   {
  101. # line 55 "NormalLoop.puma"
  102.  loop->ACF_DOLOCAL.DOLOCAL_RANGE->SLICE_EXP.START = AddConstant (loop->ACF_DOLOCAL.DOLOCAL_RANGE->SLICE_EXP.START, inc);
  103.       loop->ACF_DOLOCAL.DOLOCAL_RANGE->SLICE_EXP.STOP = AddConstant (loop->ACF_DOLOCAL.DOLOCAL_RANGE->SLICE_EXP.STOP, inc);
  104.       DoReplace (loop->ACF_DOLOCAL.DOLOCAL_BODY, loop->ACF_DOLOCAL.DOLOCAL_ID, -inc);
  105.  
  106.   }
  107.    return;
  108.  
  109.   }
  110. ;
  111. }
  112.  
  113. static void DoReplace
  114. # if defined __STDC__ | defined __cplusplus
  115. (register tTree t, register tTree id, register int inc)
  116. # else
  117. (t, id, inc)
  118.  register tTree t;
  119.  register tTree id;
  120.  register int inc;
  121. # endif
  122. {
  123.   if (t == NoTree) return;
  124.   if (id == NoTree) return;
  125.  
  126.   switch (t->Kind) {
  127.   case kACF_LIST:
  128. # line 73 "NormalLoop.puma"
  129.   {
  130. # line 74 "NormalLoop.puma"
  131.    DoReplace (t->ACF_LIST.Elem, id, inc);
  132. # line 75 "NormalLoop.puma"
  133.    DoReplace (t->ACF_LIST.Next, id, inc);
  134.   }
  135.    return;
  136.  
  137.   case kACF_EMPTY:
  138. # line 78 "NormalLoop.puma"
  139.    return;
  140.  
  141.   case kACF_DUMMY:
  142. # line 81 "NormalLoop.puma"
  143.    return;
  144.  
  145.   case kACF_BASIC:
  146. # line 84 "NormalLoop.puma"
  147.   {
  148. # line 85 "NormalLoop.puma"
  149.    DoReplace (t->ACF_BASIC.BASIC_STMT, id, inc);
  150.   }
  151.    return;
  152.  
  153.   case kACF_IF:
  154. # line 88 "NormalLoop.puma"
  155.   {
  156. # line 89 "NormalLoop.puma"
  157.  t->ACF_IF.IF_EXP = ReplaceExp (t->ACF_IF.IF_EXP, id, inc);
  158. # line 90 "NormalLoop.puma"
  159.    DoReplace (t->ACF_IF.THEN_PART, id, inc);
  160. # line 91 "NormalLoop.puma"
  161.    DoReplace (t->ACF_IF.ELSE_PART, id, inc);
  162.   }
  163.    return;
  164.  
  165.   case kACF_WHERE:
  166. # line 94 "NormalLoop.puma"
  167.   {
  168. # line 96 "NormalLoop.puma"
  169.  t->ACF_WHERE.WHERE_EXP = ReplaceExp (t->ACF_WHERE.WHERE_EXP, id, inc);
  170. # line 97 "NormalLoop.puma"
  171.    DoReplace (t->ACF_WHERE.TRUE_PART, id, inc);
  172. # line 98 "NormalLoop.puma"
  173.    DoReplace (t->ACF_WHERE.FALSE_PART, id, inc);
  174.   }
  175.    return;
  176.  
  177.   case kACF_CASE:
  178. # line 101 "NormalLoop.puma"
  179.   {
  180. # line 102 "NormalLoop.puma"
  181.  t->ACF_CASE.CASE_EXP = ReplaceExp (t->ACF_CASE.CASE_EXP, id, inc);
  182. # line 103 "NormalLoop.puma"
  183.    DoReplace (t->ACF_CASE.CASE_ALTS, id, inc);
  184. # line 104 "NormalLoop.puma"
  185.    DoReplace (t->ACF_CASE.CASE_OTHERWISE, id, inc);
  186.   }
  187.    return;
  188.  
  189.   case kSELECTED_ACF_LIST:
  190. # line 107 "NormalLoop.puma"
  191.   {
  192. # line 108 "NormalLoop.puma"
  193.    DoReplace (t->SELECTED_ACF_LIST.Elem, id, inc);
  194. # line 109 "NormalLoop.puma"
  195.    DoReplace (t->SELECTED_ACF_LIST.Next, id, inc);
  196.   }
  197.    return;
  198.  
  199.   case kSELECTED_ACF_EMPTY:
  200. # line 112 "NormalLoop.puma"
  201.    return;
  202.  
  203.   case kSELECTED_ACF_NODE:
  204. # line 115 "NormalLoop.puma"
  205.   {
  206. # line 116 "NormalLoop.puma"
  207.    DoReplace (t->SELECTED_ACF_NODE.SELECT_LIST, id, inc);
  208. # line 117 "NormalLoop.puma"
  209.    DoReplace (t->SELECTED_ACF_NODE.SELECT_ACFS, id, inc);
  210.   }
  211.    return;
  212.  
  213.   case kACF_WHILE:
  214. # line 120 "NormalLoop.puma"
  215.   {
  216. # line 121 "NormalLoop.puma"
  217.  t->ACF_WHILE.WHILE_EXP = ReplaceExp (t->ACF_WHILE.WHILE_EXP, id, inc);
  218. # line 122 "NormalLoop.puma"
  219.    DoReplace (t->ACF_WHILE.WHILE_BODY, id, inc);
  220.   }
  221.    return;
  222.  
  223.   case kACF_FORALL:
  224. # line 125 "NormalLoop.puma"
  225.   {
  226. # line 126 "NormalLoop.puma"
  227.  t->ACF_FORALL.FORALL_RANGE = ReplaceExp (t->ACF_FORALL.FORALL_RANGE, id, inc);
  228. # line 127 "NormalLoop.puma"
  229.    DoReplace (t->ACF_FORALL.FORALL_BODY, id, inc);
  230.   }
  231.    return;
  232.  
  233.   case kACF_DOLOCAL:
  234. # line 130 "NormalLoop.puma"
  235.   {
  236. # line 131 "NormalLoop.puma"
  237.  t->ACF_DOLOCAL.DOLOCAL_RANGE = ReplaceExp (t->ACF_DOLOCAL.DOLOCAL_RANGE, id, inc);
  238. # line 132 "NormalLoop.puma"
  239.    DoReplace (t->ACF_DOLOCAL.DOLOCAL_BODY, id, inc);
  240.   }
  241.    return;
  242.  
  243.   case kACF_DO:
  244. # line 135 "NormalLoop.puma"
  245.   {
  246. # line 136 "NormalLoop.puma"
  247.  t->ACF_DO.DO_RANGE = ReplaceExp (t->ACF_DO.DO_RANGE, id, inc);
  248. # line 137 "NormalLoop.puma"
  249.    DoReplace (t->ACF_DO.DO_BODY, id, inc);
  250.   }
  251.    return;
  252.  
  253.   case kASSIGN_STMT:
  254. # line 146 "NormalLoop.puma"
  255.   {
  256. # line 147 "NormalLoop.puma"
  257.    DoReplace (t->ASSIGN_STMT.ASSIGN_VAR, id, inc);
  258. # line 148 "NormalLoop.puma"
  259.  t->ASSIGN_STMT.ASSIGN_EXP = ReplaceExp (t->ASSIGN_STMT.ASSIGN_EXP, id, inc);
  260.   }
  261.    return;
  262.  
  263.   case kFORMAT_STMT:
  264. # line 151 "NormalLoop.puma"
  265.    return;
  266.  
  267.   case kIO_STMT:
  268. # line 155 "NormalLoop.puma"
  269.   {
  270. # line 156 "NormalLoop.puma"
  271.    DoReplace (t->IO_STMT.IO_ITEMS, id, inc);
  272.   }
  273.    return;
  274.  
  275.   case kCALL_STMT:
  276. # line 159 "NormalLoop.puma"
  277.   {
  278. # line 160 "NormalLoop.puma"
  279.    DoReplace (t->CALL_STMT.CALL_PARAMS, id, inc);
  280.   }
  281.    return;
  282.  
  283.   case kREDUCE_STMT:
  284. # line 163 "NormalLoop.puma"
  285.   {
  286. # line 164 "NormalLoop.puma"
  287.    DoReplace (t->REDUCE_STMT.RED_PARAMS, id, inc);
  288.   }
  289.    return;
  290.  
  291.   case kALLOCATE_STMT:
  292. # line 167 "NormalLoop.puma"
  293.   {
  294. # line 168 "NormalLoop.puma"
  295.    DoReplace (t->ALLOCATE_STMT.PARAMS, id, inc);
  296. # line 169 "NormalLoop.puma"
  297.  t->ALLOCATE_STMT.STAT = ReplaceExp (t->ALLOCATE_STMT.STAT, id, inc);
  298.   }
  299.    return;
  300.  
  301.   case kDEALLOCATE_STMT:
  302. # line 172 "NormalLoop.puma"
  303.   {
  304. # line 173 "NormalLoop.puma"
  305.    DoReplace (t->DEALLOCATE_STMT.PARAMS, id, inc);
  306. # line 174 "NormalLoop.puma"
  307.  t->DEALLOCATE_STMT.STAT = ReplaceExp (t->DEALLOCATE_STMT.STAT, id, inc);
  308.   }
  309.    return;
  310.  
  311.   case kGOTO_STMT:
  312. # line 177 "NormalLoop.puma"
  313.    return;
  314.  
  315.   case kCOMP_IF_STMT:
  316. # line 180 "NormalLoop.puma"
  317.   {
  318. # line 181 "NormalLoop.puma"
  319.  t->COMP_IF_STMT.IF_EXP = ReplaceExp (t->COMP_IF_STMT.IF_EXP, id, inc);
  320. # line 182 "NormalLoop.puma"
  321.    if (! (ReplaceExp (t->COMP_IF_STMT.IF_EXP, id, inc))) goto yyL23;
  322.   }
  323.    return;
  324. yyL23:;
  325.  
  326.   break;
  327.   case kSTOP_STMT:
  328. # line 185 "NormalLoop.puma"
  329.   {
  330. # line 186 "NormalLoop.puma"
  331.  t->STOP_STMT.STOP_CONST = ReplaceExp (t->STOP_STMT.STOP_CONST, id, inc);
  332.   }
  333.    return;
  334.  
  335.   case kRETURN_STMT:
  336. # line 189 "NormalLoop.puma"
  337.   {
  338. # line 190 "NormalLoop.puma"
  339.  t->RETURN_STMT.RETURN_EXP = ReplaceExp (t->RETURN_STMT.RETURN_EXP, id, inc);
  340.   }
  341.    return;
  342.  
  343.   case kBTP_LIST:
  344. # line 199 "NormalLoop.puma"
  345.   {
  346. # line 200 "NormalLoop.puma"
  347.    DoReplace (t->BTP_LIST.Elem, id, inc);
  348. # line 201 "NormalLoop.puma"
  349.    DoReplace (t->BTP_LIST.Next, id, inc);
  350.   }
  351.    return;
  352.  
  353.   case kBTP_EMPTY:
  354. # line 204 "NormalLoop.puma"
  355.    return;
  356.  
  357.   case kBTE_LIST:
  358. # line 207 "NormalLoop.puma"
  359.   {
  360. # line 208 "NormalLoop.puma"
  361.  t->BTE_LIST.Elem = ReplaceExp (t->BTE_LIST.Elem, id, inc);
  362. # line 209 "NormalLoop.puma"
  363.    DoReplace (t->BTE_LIST.Next, id, inc);
  364.   }
  365.    return;
  366.  
  367.   case kBTE_EMPTY:
  368. # line 212 "NormalLoop.puma"
  369.    return;
  370.  
  371.   case kVAR_PARAM:
  372.   if (t->VAR_PARAM.V->Kind == kLOOP_VAR) {
  373.   if (id->Kind == kLOOP_VAR) {
  374. # line 223 "NormalLoop.puma"
  375.   {
  376. # line 225 "NormalLoop.puma"
  377.  t->VAR_PARAM.V = mADDR (AddConstant (mVAR_EXP (t->VAR_PARAM.V), inc));
  378.   }
  379.    return;
  380.  
  381.   }
  382.   }
  383.   if (t->VAR_PARAM.V->Kind == kADDR) {
  384. # line 228 "NormalLoop.puma"
  385.   {
  386. # line 229 "NormalLoop.puma"
  387.  t->VAR_PARAM.V->ADDR.E = ReplaceExp (t->VAR_PARAM.V->ADDR.E, id, inc);
  388.   }
  389.    return;
  390.  
  391.   }
  392. # line 232 "NormalLoop.puma"
  393.   {
  394. # line 233 "NormalLoop.puma"
  395.    DoReplace (t->VAR_PARAM.V, id, inc);
  396.   }
  397.    return;
  398.  
  399.   case kFUNC_PARAM:
  400. # line 236 "NormalLoop.puma"
  401.    return;
  402.  
  403.   case kUSED_VAR:
  404. # line 245 "NormalLoop.puma"
  405.    return;
  406.  
  407.   case kSUBSTRING_VAR:
  408. # line 248 "NormalLoop.puma"
  409.   {
  410. # line 249 "NormalLoop.puma"
  411.    DoReplace (t->SUBSTRING_VAR.IND_VAR, id, inc);
  412. # line 250 "NormalLoop.puma"
  413.  t->SUBSTRING_VAR.IND_EXP = ReplaceExp (t->SUBSTRING_VAR.IND_EXP, id, inc);
  414.   }
  415.    return;
  416.  
  417.   case kINDEXED_VAR:
  418. # line 253 "NormalLoop.puma"
  419.   {
  420. # line 254 "NormalLoop.puma"
  421.    DoReplace (t->INDEXED_VAR.IND_VAR, id, inc);
  422. # line 255 "NormalLoop.puma"
  423.    DoReplace (t->INDEXED_VAR.IND_EXPS, id, inc);
  424.   }
  425.    return;
  426.  
  427.   }
  428.  
  429. # line 258 "NormalLoop.puma"
  430.   {
  431. # line 259 "NormalLoop.puma"
  432.    error_protocol ("unknown tree node in DoReplace");
  433. # line 260 "NormalLoop.puma"
  434.    printf ("Unknow Tree Node");
  435. # line 261 "NormalLoop.puma"
  436.    WriteTree (stdout, t);
  437. # line 262 "NormalLoop.puma"
  438.    kill_in_protocol ();
  439.   }
  440.    return;
  441.  
  442. ;
  443. }
  444.  
  445. static tTree ReplaceExp
  446. # if defined __STDC__ | defined __cplusplus
  447. (register tTree exp, register tTree id, register int inc)
  448. # else
  449. (exp, id, inc)
  450.  register tTree exp;
  451.  register tTree id;
  452.  register int inc;
  453. # endif
  454. {
  455. # line 273 "NormalLoop.puma"
  456.   {
  457. # line 274 "NormalLoop.puma"
  458.    if (! (IsVarInExp (TreeVarName (id), exp) == false)) goto yyL1;
  459.   }
  460.    return exp;
  461. yyL1:;
  462.  
  463. # line 278 "NormalLoop.puma"
  464.  {
  465.   int a;
  466.   int b;
  467.   bool found;
  468.   tTree var;
  469.   {
  470. # line 280 "NormalLoop.puma"
  471.  
  472. # line 281 "NormalLoop.puma"
  473.  
  474. # line 282 "NormalLoop.puma"
  475.  
  476. # line 283 "NormalLoop.puma"
  477.  
  478. # line 285 "NormalLoop.puma"
  479.  ResolveExpression (exp, &found, &a, &b, &var);
  480.  
  481.       if (found)
  482.         found = ( (a == 1) && (TreeVarName (id) == TreeVarName (var)) );
  483.  
  484. # line 290 "NormalLoop.puma"
  485.    if (! ((found == true))) goto yyL2;
  486.   }
  487.   {
  488.    return AddConstant (exp, inc);
  489.   }
  490.  }
  491. yyL2:;
  492.  
  493.  
  494.   switch (exp->Kind) {
  495.   case kVAR_EXP:
  496.   if (exp->VAR_EXP.V->Kind == kLOOP_VAR) {
  497.   if (id->Kind == kLOOP_VAR) {
  498. # line 294 "NormalLoop.puma"
  499.   {
  500. # line 295 "NormalLoop.puma"
  501.    if (! (TreeVarName (exp->VAR_EXP.V) == TreeVarName (id))) goto yyL3;
  502.   }
  503.    return AddConstant (exp, inc);
  504. yyL3:;
  505.  
  506.   }
  507.   }
  508. # line 299 "NormalLoop.puma"
  509.   {
  510. # line 300 "NormalLoop.puma"
  511.    DoReplace (exp->VAR_EXP.V, id, inc);
  512.   }
  513.    return exp;
  514.  
  515.   case kADDR:
  516. # line 304 "NormalLoop.puma"
  517.   {
  518. # line 305 "NormalLoop.puma"
  519.    DoReplace (exp->ADDR.E, id, inc);
  520.   }
  521.    return exp;
  522.  
  523.   case kARRAY_EXP:
  524. # line 309 "NormalLoop.puma"
  525.   {
  526. # line 310 "NormalLoop.puma"
  527.    DoReplace (exp->ARRAY_EXP.ELEMENTS, id, inc);
  528.   }
  529.    return exp;
  530.  
  531.   case kSLICE_EXP:
  532. # line 314 "NormalLoop.puma"
  533.   {
  534. # line 315 "NormalLoop.puma"
  535.  exp->SLICE_EXP.START =  ReplaceExp (exp->SLICE_EXP.START, id, inc);
  536.       exp->SLICE_EXP.STOP  =  ReplaceExp (exp->SLICE_EXP.STOP, id, inc);
  537.       exp->SLICE_EXP.INC  =  ReplaceExp (exp->SLICE_EXP.INC, id, inc);
  538.  
  539.   }
  540.    return exp;
  541.  
  542.   case kOP_EXP:
  543. # line 322 "NormalLoop.puma"
  544.   {
  545. # line 323 "NormalLoop.puma"
  546.  exp->OP_EXP.OPND1 = ReplaceExp (exp->OP_EXP.OPND1, id, inc);
  547.       exp->OP_EXP.OPND2 = ReplaceExp (exp->OP_EXP.OPND2, id, inc);
  548.  
  549.   }
  550.    return exp;
  551.  
  552.   case kOP1_EXP:
  553. # line 329 "NormalLoop.puma"
  554.   {
  555. # line 330 "NormalLoop.puma"
  556.  exp->OP1_EXP.OPND = ReplaceExp (exp->OP1_EXP.OPND, id, inc);
  557.   }
  558.    return exp;
  559.  
  560.   case kFUNC_CALL_EXP:
  561. # line 334 "NormalLoop.puma"
  562.   {
  563. # line 335 "NormalLoop.puma"
  564.  DoReplace (exp->FUNC_CALL_EXP.FUNC_PARAMS, id, inc);
  565.   }
  566.    return exp;
  567.  
  568.   case kDO_EXP:
  569. # line 339 "NormalLoop.puma"
  570.   {
  571. # line 340 "NormalLoop.puma"
  572.  exp->DO_EXP.RANGE = ReplaceExp (exp->DO_EXP.RANGE, id, inc);
  573.       DoReplace (exp->DO_EXP.BODY, id, inc);
  574.  
  575.   }
  576.    return exp;
  577.  
  578.   }
  579.  
  580. # line 346 "NormalLoop.puma"
  581.   {
  582. # line 347 "NormalLoop.puma"
  583.    printf ("ReplaceExp failed\n");
  584. # line 348 "NormalLoop.puma"
  585.    WriteTree (stdout, exp);
  586. # line 349 "NormalLoop.puma"
  587.    kill_in_protocol ();
  588.   }
  589.    return NoTree;
  590.  
  591. }
  592.  
  593. void BeginNormalLoop ()
  594. {
  595. }
  596.  
  597. void CloseNormalLoop ()
  598. {
  599. }
  600.